import 'package:auto_route/auto_route.dart';
import 'package:flutter/cupertino.dart';
import 'package:provider/provider.dart';
import 'package:provider_student/config/app_router.dart';
import 'package:provider_student/providers/api_provider.dart';
import 'package:provider_student/services/http_service.dart'; // 导入 HttpService
import 'providers/auth_provider.dart';
import 'config/app_config.dart'; // 确保这些导入路径正确

// 全局或顶层定义 HttpService 实例
// 在 main() 中初始化，并确保在 runApp 之前完成
late HttpService httpService;

void main() async {
  // 确保 Flutter Widgets 绑定已初始化
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化 HttpService
  httpService = HttpService();
  await httpService.initialize(); // 调用 HttpService 的异步初始化方法

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  MyApp({super.key});

  late AppRouter _appRouter;

  @override
  Widget build(BuildContext context) {
    // 在现有的MultiProvider中添加
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => AuthProvider()),
        // 将已初始化好的 httpService 实例传递给 ApiProvider
        ChangeNotifierProvider(
          create: (_) => ApiProvider(httpService: httpService),
        ),
      ],
      // Consumer 仍然用于监听 AuthProvider 的变化来构建 AppRouter
      child: Builder(
        // 使用 Builder 来获取包含 Provider 的 context
        builder: (context) {
          final authProvider = Provider.of<AuthProvider>(context);
          // 使用包含 authProvider 的 AuthGuard 初始化 AppRouter
          _appRouter = AppRouter(authGuard: AuthGuard(authProvider));
          return CupertinoApp.router(
            title: AppConfig.appName,
            theme: const CupertinoThemeData(
              primaryColor: CupertinoColors.activeBlue,
              brightness: Brightness.light,
              scaffoldBackgroundColor: CupertinoColors.systemGroupedBackground,
              textTheme: CupertinoTextThemeData(
                navTitleTextStyle: TextStyle(
                  fontSize: 18,
                  fontWeight: FontWeight.w600,
                  color: CupertinoColors.black,
                ),
              ),
            ),
            routeInformationParser: _appRouter.defaultRouteParser(),
            routerDelegate: _appRouter.delegate(),
            // routerConfig: _appRouter.config(), // 传递路由配置
            debugShowCheckedModeBanner: false,
          );
        },
      ),
    );
  }

  // 这个 _buildHomeScreen 方法在使用了 auto_route 后就不再需要了，可以删除
  // Widget _buildHomeScreen(AuthProvider auth) {
  //   // 根据认证状态显示不同的页面
  //   switch (auth.status) {
  //     case AuthStatus.authenticated:
  //       return const MainScreen();
  //     case AuthStatus.unauthenticated:
  //     case AuthStatus.error:
  //       return const LoginScreen();
  //     case AuthStatus.initial:
  //     case AuthStatus.authenticating:
  //       // 显示加载页面
  //       return const CupertinoPageScaffold(
  //         child: Center(child: CupertinoActivityIndicator()),
  //       );
  //   }
  // }
}

// 你的 AuthGuard 保持不变 (假设 AppRouter 中已经引入了 SplashRoute)
class AuthGuard extends AutoRouteGuard {
  final AuthProvider authProvider;

  AuthGuard(this.authProvider);

  @override
  void onNavigation(NavigationResolver resolver, StackRouter router) {
    final String targetRouteName = resolver.route.name;

    // 如果正在尝试导航到登录页，并且用户是未认证状态，则允许继续到登录页
    if (targetRouteName == LoginRoute.name) {
      if (authProvider.status == AuthStatus.unauthenticated ||
          authProvider.status == AuthStatus.error) {
        resolver.next(true); // 允许进入登录页
      } else {
        // 如果已认证但仍尝试访问登录页，重定向到主页
        router.replaceAll([const MainRoute()]); // 假设 MainRoute 是认证后的主页
        resolver.next(false);
      }
      return; // 处理完登录页逻辑后返回
    }

    // 如果目标是 SplashScreen (初始加载页)
    if (targetRouteName == SplashRoute.name) {
      // 始终允许进入 SplashScreen
      resolver.next(true);
      return;
    }

    // 对于其他所有受保护的路由 (MainRoute 等)
    switch (authProvider.status) {
      case AuthStatus.authenticated:
        resolver.next(true); // 已认证，允许进入
        break;
      case AuthStatus.unauthenticated:
      case AuthStatus.error:
        // 未认证或出错，重定向到登录页
        // 检查当前是否已经在登录页，避免不必要的重定向循环
        if (targetRouteName != LoginRoute.name) {
          router.replaceAll([const LoginRoute()]);
        }
        resolver.next(false); // 阻止当前导航
        break;
      case AuthStatus.initial:
      case AuthStatus.authenticating:
        // 认证状态未确定，重定向到启动画面
        // 同样，检查当前是否已经在启动画面，避免循环
        if (targetRouteName != SplashRoute.name) {
          router.replaceAll([const SplashRoute()]);
        }
        resolver.next(false); // 阻止当前导航
        break;
    }
  }
}

// 你的 SplashScreen 保持不变
@RoutePage()
class SplashScreen extends StatelessWidget {
  const SplashScreen({super.key});

  @override
  Widget build(BuildContext context) {
    // 这个屏幕只是一个占位符。
    // AuthGuard 将在认证状态确定后处理重定向。
    return const CupertinoPageScaffold(
      child: Center(child: CupertinoActivityIndicator()),
    );
  }
}
